<?php

class TestCriteriaCollection extends PHPUnitTest {

    public function testCriteriaCollectionWithSimpleCriteria() {
        $criteriaCollection = new CriteriaCollection();
        $criteriaCollection->addCriteria(new Criteria('id', Criteria::EQUAL, '2'));

        $criteriaString = $criteriaCollection->getCriteriaString();

        $this->assertEquals("(id = '2')", $criteriaString);
    }

    public function testCriteriaCollectionWithTwoNestedCriterion() {
        $idCriteria = new Criteria('id', Criteria::EQUAL, '2');
        $dataCriteria = new Criteria('data', Criteria::EQUAL, 'ABC');
        $criteriaCollection = new CriteriaCollection();
        $criteriaCollection->addCriteria(new Criteria($idCriteria, Criteria::AND_EXPRESSION, $dataCriteria));

        $criteriaString = $criteriaCollection->getCriteriaString();

        $this->assertEquals("((id = '2') AND (data = 'ABC'))", $criteriaString);
    }

    public function testCriteriaCollectionWithUseTwoCriterion() {
        $criteriaCollection = new CriteriaCollection();
        $criteriaCollection->addCriteria(new Criteria('id', Criteria::EQUAL, '2'));
        $criteriaCollection->addCriteria(new Criteria('data', Criteria::EQUAL, 'ABC'));

        $criteriaString = $criteriaCollection->getCriteriaString();

        $this->assertEquals("(id = '2') AND (data = 'ABC')", $criteriaString);
    }

    public function testCriteriaCollectionWithOrCriterion() {
        $criteriaCollection = new CriteriaCollection();
        $criteriaCollection->addCriteria(new Criteria('id', Criteria::EQUAL, '2'));
        $criteriaCollection->addOrCriteria(new Criteria('data', Criteria::EQUAL, 'ABC'));

        $criteriaString = $criteriaCollection->getCriteriaString();

        $this->assertEquals("(id = '2') OR (data = 'ABC')", $criteriaString);
    }

    public function testCriteriaCollectionWithNestedCriterion() {
        $criteriaCollection = new CriteriaCollection();
        $idCriteria = new Criteria('id', Criteria::EQUAL, '2');
        $dataCriteria = new Criteria('data', Criteria::EQUAL, 'ABC');
        $subCriteria1 = new Criteria($idCriteria, Criteria::AND_EXPRESSION, $dataCriteria);
        $subCriteria2 = new Criteria('data', Criteria::NOT_EQUAL, 'XYZ');
        $criteria = new Criteria($subCriteria1, Criteria::OR_EXPRESSION, $subCriteria2);
        $criteriaCollection->addCriteria($criteria);

        $sqlQuery = $criteriaCollection->getCriteriaString();

        $this->assertEquals("(((id = '2') AND (data = 'ABC')) OR (data <> 'XYZ'))", $sqlQuery);
    }

}